const {getError, getResult} = require('./handle')
const getNecessary = require('./async/getNecessary')

/**
 * 访问外链URL
 * url可以是字符串，即完整的链接。标准类型应为对象
 * 		type：请求类型
 *  	text：请求说明
 * 		url：完整链接
 * 		data：访问参数。优先级高于后面参数中的data
 * 访问自身其它云服务空间的参数特点：必须要以对应云函数的参数名为key建立对象。比如访问b-fetch的get云函数，参数为{data: {params: {name: ''…}}}
 */
module.exports = (url, {
	data = {},
	method = 'POST', // 如果是GET，data里面的对象只保留了key，没有value。如果是GET，要将参数拼写进url中，由于可能是复杂对象，无法做拼写操作，所以后端访问默认都是POST，不可默认改为GET
	headers,
	content, // POST模式下用form拼接的参数
	timeout = 5000,
	dataType = 'json', // 指定返回值为json格式，自动进行parse
	contentType = 'json', // 指定以application/json发送data内的数据
	fixIp // 是否固定IP。仅阿里云有效
} = {}) => {
	if (!url) {
		return {
			errCode: 'PARAMS_IS_ERROR',
			errMsg: '查询的参数不正确'
		}
	}
	if (typeof(url) === 'object') {
		const {type, text} = url
		if (url.data) {
			data = url.data
		}
		if (url.headers) {
			headers = url.headers
		}
		url = url.url
		if (type) {
			method = type
		}
		console.log(text)
	}
	const necessary = getNecessary()
	necessary.initial = JSON.stringify(necessary.initial)
	return new Promise((resolve, reject) => {
		console.log(`开始请求：${url}`)
		const params = {
			data, 
			content,
			timeout,
			dataType,
			contentType,
			headers: {
				contentType,
				dataType,
				...necessary,
				...headers,
			}
		}
		params.method = method // 请求类型
		uniCloud.httpclient.request(url, params).then(res => {
			const {status, statusCode, statusMessage, data} = res.res
			if (status === 200 && statusCode === 200) {
				console.log(`请求成功：${url}`)
				console.log(res)
				if (data && data.requestId) {
					// 访问自身url化的云函数，可以直接返回
					data.status = 200
					resolve(data)
				} else {
					resolve(getResult({data}))
				}
			} else {
				console.warn(`返回数据错误：${url}`)
				console.warn(res)
				reject(getError(res.data && res.data.message ? res.data.message : '返回数据错误', status || statusCode || 201))
			}
		}).catch(err => {
			console.error(`请求失败：${url}`)
			console.error(err)
			reject(err)
		})
	})
}